using System;
using System.Collections.Generic;
using System.Linq;
using System.Transactions;

using PMServiceDesk.DataType;
using PMServiceDesk.DataAccess;
using PMServiceDesk.Parameters.Constantes;

namespace PMServiceDesk.BusinessLogic
{
    public class PermisoRolPaqueteTrabajoLogic
    {
        #region Variables

        private PermisoRolPaqueteTrabajoData _permisoRolPaqueteTrabajoData;
        private TransicionEstadoData _transicionEstadoData;
        private DocumentoTransicionEstadoData _documentoTransicionEstadoData;

        #endregion

        #region Constructores

        public PermisoRolPaqueteTrabajoLogic()
        {
            _permisoRolPaqueteTrabajoData = new PermisoRolPaqueteTrabajoData();
            _transicionEstadoData = new TransicionEstadoData();
            _documentoTransicionEstadoData = new DocumentoTransicionEstadoData();
        }

        #endregion

        #region Metodos

        public PermisoRolPaqueteTrabajoType CargarPorId(string id)
        {
            _permisoRolPaqueteTrabajoData.FiltrarPorId(id);

            return _permisoRolPaqueteTrabajoData.Cargar();
        }

        public void Grabar(PermisoRolPaqueteTrabajoType permisoRolPaqueteTrabajo)
        {
            _permisoRolPaqueteTrabajoData.Grabar(permisoRolPaqueteTrabajo);
        }

        public List<PermisoRolPaqueteTrabajoType> CargarExplorador(string rolId,string estadoPaqueteTrabajoId)
        {
            if(rolId != "") _permisoRolPaqueteTrabajoData.FiltrarPorRolId(rolId);
            if(estadoPaqueteTrabajoId != "") _permisoRolPaqueteTrabajoData.FiltrarPorEstadoPaqueteTrabajoId(estadoPaqueteTrabajoId);

            return _permisoRolPaqueteTrabajoData.CargarListaVista();
        }

        public List<PermisoRolPaqueteTrabajoType> CargarPermisos(string rolId)
        {
            List<PermisoRolPaqueteTrabajoType> lista = _permisoRolPaqueteTrabajoData.CargarPermisos(rolId);

            List<TransicionEstadoType> transicionesBD = new TransicionEstadoLogic().CargarPorRolId(rolId);

            foreach (PermisoRolPaqueteTrabajoType permiso in lista)
                permiso.TransicionesEstado = this._transicionesEstado(lista, permiso,transicionesBD);

            return lista;
        }

        public List<TransicionEstadoType> _transicionesEstado(List<PermisoRolPaqueteTrabajoType> permisos, PermisoRolPaqueteTrabajoType permiso, List<TransicionEstadoType> transicionesBD)
        {
            List<PermisoRolPaqueteTrabajoType> auxiliar = (
                                                              from registro in permisos
                                                              where registro.TipoPaqueteTrabajoId == permiso.TipoPaqueteTrabajoId 
                                                              && registro.EstadoPaqueteTrabajoId != permiso.EstadoPaqueteTrabajoId
                                                              select registro
                                                          ).ToList();

            List<TransicionEstadoType> t_BD = null;

            List<TransicionEstadoType> transiciones = new List<TransicionEstadoType>();
            TransicionEstadoType t = null;
            
            foreach (PermisoRolPaqueteTrabajoType p in auxiliar)
            {
                t = new TransicionEstadoType();

                t_BD = (
                            from registro in transicionesBD
                            where registro.PermisoRolId == permiso.Id
                            && registro.EstadoOrigenId == permiso.EstadoPaqueteTrabajoId 
                            && registro.EstadoDestinoId == p.EstadoPaqueteTrabajoId
                            select registro
                       ).ToList();

                if(t_BD.Any()) 
                    t.Id = t_BD.First().Id;
                else 
                    t.Id = "0";
                
                t.PermisoRolId = permiso.Id;
                t.EstadoOrigenId = permiso.EstadoPaqueteTrabajoId;
                t.EstadoDestinoId = p.EstadoPaqueteTrabajoId;
                t.EstadoDestino = p.EstadoPaqueteTrabajo;
                t.Habilitado = ((from id in permiso.Transicion.Split(',') where id == t.EstadoDestinoId select id).ToList().Count > 0);

                transiciones.Add(t);
            }

            return transiciones;
        }

        #endregion
    }
}
